/*
 *
 * Copyright (c) 2016. 深圳联友科技. All rights reserved.
 * 
 */

package com.blt.car.base;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;


import java.util.List;


/**
 * Adapter基类
 *
 * @param <T>
 * @date create at 2016-11-30
 * @修订 <p>guide_1.增加一些列add及remove方法，根据viewHolder的改动优化showView方法，添加所有注释 by ly-litingchuan  at 2016/12/6
 */
public abstract class BaseCommonAdapter<T> extends BaseAdapter {

    protected LayoutInflater mInflater;
    protected Context mContext;
    protected List<T> mList;

    protected int itemLayoutId;

    /**
     * @param mContext     用于获取view的上下文
     * @param mList        数据集
     * @param itemLayoutId item的xml文件的id
     */
    public BaseCommonAdapter(Context mContext, List<T> mList, int itemLayoutId) {
        this.mContext = mContext;
        this.mInflater = LayoutInflater.from(mContext);
        this.mList = mList;
        this.itemLayoutId = itemLayoutId;
    }

    /**
     * @return 获取数据集
     */
    public List<T> getList() {
        return this.mList;
    }

    /**
     * 设置数据集
     *
     * @param list 设置数据集
     */
    public void setList(List<T> list) {
        this.mList = list;
        notifyDataSetChanged();
    }

    /**
     * 添加数据
     *
     * @param t 数据
     */
    public void add(T t) {
        this.mList.add(t);
        notifyDataSetChanged();
    }

    /**
     * 添加数据
     *
     * @param list 数据
     */
    public void addAll(List<T> list) {
        mList.clear();
        this.mList.addAll(list);
        notifyDataSetChanged();
    }

    /**
     * 删除数据
     *
     * @param position 需要删除的数据在数据集的位置
     */
    public void remove(int position) {
        this.mList.remove(position);
        notifyDataSetChanged();
    }

    /**
     * 删除数据
     *
     * @param list 需要删除的数据列表
     */
    public void removeAll(List<T> list) {
        this.mList.removeAll(list);
    }

    /**
     * 删除所有数据
     */
    public void clear() {
        this.mList.clear();
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public T getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (null == convertView) {
            convertView = mInflater.inflate(itemLayoutId, null);
        }
        showView(position, convertView, parent);

        return convertView;
    }

    /**
     * 继承后重写的方法，用于交互的处理
     *
     * @param position    当前需要显示的数据在数据源中的位置
     * @param convertView 从屏幕上下边缘移出后，回收的view
     * @param parent      convertView所处于的父视图，例如被放进ListView时，这个parent是该ListView
     */
    public abstract void showView(int position, View convertView, ViewGroup parent);
}
